Node.js Security

Node.js

Node.js-এ কেন নিরাপত্তা গুরুত্বপূর্ণ

Node.js :

জাভাস্ক্রিপ্ট প্রসঙ্গ আকার

npm রেজিস্ট্রিতে 1.5 মিলিয়নেরও বেশি প্যাকেজ রয়েছে, যা সমস্ত নির্ভরতার নিরাপত্তা যাচাই করা কঠিন করে তোলে

সার্ভার-সাইড প্রক্রিয়াকরণ

ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্টের বিপরীতে, Node.js-এর ফাইল সিস্টেম, নেটওয়ার্ক এবং অন্যান্য গুরুত্বপূর্ণ সংস্থানগুলিতে অ্যাক্সেস রয়েছে

ডিফল্ট অনুমতি

Node.js ,

ইভেন্ট-প্রদত্ত আর্কিটেকচার

অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপগুলি জটিল প্রক্রিয়াকরণ প্রবাহ তৈরি করতে পারে যা সুরক্ষা ত্রুটিগুলি আড়াল করতে পারে

যখন Node.js অ্যাপ্লিকেশন আপস করা হয়, আক্রমণকারীরা:

সংবেদনশীল ব্যবহারকারীর ডেটা অ্যাক্সেস করুন
অ্যাপ্লিকেশন আচরণ ম্যানিপুলেট করতে পারেন
আপনি ক্রিপ্টোকারেন্সি মাইনিংয়ের জন্য আপনার সার্ভার ব্যবহার করতে পারেন
অন্যান্য কম্পিউটারের বিরুদ্ধে আক্রমণ শুরু করতে পারে
এতে আপনার প্রতিষ্ঠানের সুনাম নষ্ট হতে পারে

Node.js-এ সাধারণ নিরাপত্তা দুর্বলতা

অভাব ব্যাখ্যা প্রভাব
ইনজেকশন আক্রমণ অ্যাপ্লিকেশন দ্বারা প্রক্রিয়াকৃত ইনপুটগুলিতে দূষিত কোড ঢোকানো (SQL, NoSQL, OS কমান্ড) ডেটা চুরি, অননুমোদিত অ্যাক্সেস, পরিষেবা বাধা
ক্রস-সাইট স্ক্রিপ্টিং (XSS) অন্যান্য ব্যবহারকারীদের দ্বারা দেখা ওয়েব পৃষ্ঠাগুলিতে ক্লায়েন্ট-সাইড স্ক্রিপ্ট ইনজেকশন করা সেশন হাইজ্যাকিং, ক্রেডেনশিয়াল স্টিলিং, এডিটিং
ভাঙা প্রমাণীকরণ প্রমাণীকরণ প্রক্রিয়ার ত্রুটি যা প্রমাণের সাথে আপস করার অনুমতি দেয় অ্যাকাউন্ট গ্রহণ, অফার H.R
অনিরাপদ নির্ভরতা পরিচিত ত্রুটি সহ তৃতীয় পক্ষের প্যাকেজ ব্যবহার করা নির্ভরতা থেকে সমস্ত ত্রুটি উত্তরাধিকারসূত্রে পাওয়া যায়
তথ্য প্রকাশ ত্রুটি বার্তা, লগ বা প্রতিক্রিয়া মাধ্যমে সংবেদনশীল তথ্য ফাঁস কম্পিউটার তথ্য প্রকাশ, তথ্য ফাঁস
ক্রস-সাইট দাবি জালিয়াতি অবাঞ্ছিত ক্রিয়া সম্পাদনের জন্য অনুমোদিত ব্যবহারকারীদের প্রতারণা করা ব্যবহারকারীদের পক্ষে অননুমোদিত ক্রিয়াকলাপ সম্পাদন করা
নিরাপত্তা ভুল কনফিগারেশন Node.js বিভিন্ন নিরাপত্তা ফাঁক এবং ত্রুটি
পথ অতিক্রম করবে উদ্দিষ্ট অ্যাপ্লিকেশন পাথের বাইরে ফাইল এবং ডিরেক্টরি অ্যাক্সেস করা অননুমোদিত ফাইল অ্যাক্সেস, কোড এক্সিকিউশন

অপরিহার্য নিরাপত্তা সেরা অনুশীলন

1. ইনপুট বৈধতা এবং পরিমার্জন

ব্যবহারকারীর ইনপুট বিশ্বাস করবেন না. আপনার অ্যাপের বাইরে থেকে আসা সমস্ত ডেটা সর্বদা যাচাই এবং স্যানিটাইজ করুন।

উদাহরণ: এক্সপ্রেস-ভ্যালিডেটরের সাথে ইনপুট বৈধতা

const express = require('express');
const { body, validationResult } = require('express-validator');
const app = express();

app.use(express.json());

// Define validation rules
const userValidationRules = [
  body('email').isEmail().normalizeEmail(),
  body('password').isLength({ min: 8 }),
  body('age').isInt({ min: 18 }).toInt(),
  body('name').trim().escape().notEmpty()
];

// Apply validation
app.post('/register', userValidationRules, (req, res) => {
  // Check for validation errors
  const errors = validationResult(req);
  
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }

  // Process validated data
  const { email, password, age, name } = req.body;
  // ... safe to use validated data

  res.status(201).json({ message: 'User registered successfully' });
});

2. ইনজেকশন আক্রমণের বিরুদ্ধে সুরক্ষা

SQL, NoSQL, কমান্ড ইনজেকশন এবং অনুরূপ আক্রমণ প্রতিরোধ করতে, প্যারামিটারাইজড প্রশ্নগুলি ব্যবহার করুন এবং ব্যবহারকারীর ইনপুটের সরাসরি সংযোগ এড়ান।

উদাহরণ: এসকিউএল ইনজেকশন প্রতিরোধ

// VULNERABLE - DO NOT USE
function searchUsersUnsafe(name) {
  // Direct string concatenation - VULNERABLE TO INJECTION
  return db.query(`SELECT * FROM users WHERE name LIKE '%${name}%'`);
}

// SAFE - USE THIS APPROACH
function searchUsersSafe(name) {
  // Parameterized query - PROTECTED AGAINST INJECTION
  return db.query('SELECT * FROM users WHERE name LIKE ?', [`%${name}%`]);
}

3. ক্রস-সাইট স্ক্রিপ্টিং (XSS) প্রতিরোধ

সঠিকভাবে আউটপুট এনকোডিং এবং একটি বিষয়বস্তু নিরাপত্তা নীতি (CSP) ব্যবহার করে XSS থেকে রক্ষা করুন।

উদাহরণ: XSS প্রতিরোধ

const express = require('express');
const app = express();

// VULNERABLE - Direct insertion of user input into HTML
app.get('/unsafe', (req, res) => {
  const userInput = req.query.message || '';
  res.send(`
Your message: ${userInput}
`); }); // SAFE - Encoding user input app.get('/safe', (req, res) => { const userInput = req.query.message || ''; // Encode HTML special characters const safeInput = userInput .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); res.send(`
Your message: ${safeInput}
`); });

4. নির্ভরতা আপডেট করুন

npm অডিট এবং অন্যান্য নিরাপত্তা সরঞ্জাম ব্যবহার করে ভাঙা নির্ভরতার জন্য নিয়মিত পরীক্ষা করুন এবং আপডেট করুন।

ত্রুটিগুলি পরীক্ষা করে

# Check for vulnerable dependencies
npm audit

# Automatically fix vulnerabilities when possible
npm audit fix

# Check for vulnerable dependencies in production only
npm audit --production

# Generate a detailed report
npm audit --json > audit-report.json

5. নিরাপদ প্রমাণীকরণ পদ্ধতি

যথাযথ পাসওয়ার্ড হ্যাশিং, অ্যাকাউন্ট লক, এবং মাল্টি-ফ্যাক্টর প্রমাণীকরণের সাথে নিরাপদে প্রমাণীকরণ সক্ষম করুন।

উদাহরণ: সুরক্ষিত পাসওয়ার্ড হ্যাশিং

const crypto = require('crypto');

// Generate a random salt
function generateSalt() {
  return crypto.randomBytes(16).toString('hex');
}

// Hash password with PBKDF2
function hashPassword(password, salt) {
  return crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');
}

// Register a new user with secure password storage
function registerUser(username, password) {
  // Generate unique salt for this user
  const salt = generateSalt();
  
  // Hash the password with the salt
  const hashedPassword = hashPassword(password, salt);
  
  // Store username, hashedPassword, and salt in database
  // NEVER store plaintext passwords
  return { username, hashedPassword, salt };
}

// Verify a login attempt
function verifyUser(username, password, storedHash, storedSalt) {
  // Hash the provided password with the stored salt
  const hashedAttempt = hashPassword(password, storedSalt);
  
  // Time-constant comparison to prevent timing attacks
  return crypto.timingSafeEqual(
    Buffer.from(hashedAttempt, 'hex'),
    Buffer.from(storedHash, 'hex')
  );
}

6. নিরাপত্তা শিরোনাম ব্যবহার করুন

বিভিন্ন আক্রমণ থেকে রক্ষা করতে HTTP নিরাপত্তা শিরোনাম সক্ষম করুন। এটি সহজ করতে Helmet.js এর মত প্যাকেজ ব্যবহার করুন।

উদাহরণ: Helmet.js ব্যবহার করা

const express = require('express');
const helmet = require('helmet');
const app = express();

// Apply all security headers with default settings
app.use(helmet());

// Or customize specific headers
app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'unsafe-inline'", 'trusted-cdn.com']
    }
  },
  // Prevent clickjacking
  frameguard: { action: 'deny' },
  // Strict-Transport-Security
  hsts: { maxAge: 15552000, includeSubDomains: true }
}));

7. HTTPS ব্যবহার করুন

ট্রানজিটে ডেটা এনক্রিপ্ট করতে উৎপাদন পরিবেশে সর্বদা HTTPS ব্যবহার করুন।

উদাহরণ: এক্সপ্রেসে HTTPS সেট আপ করা

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

// Your Express routes here
app.get('/', (req, res) => {
  res.send('Secure HTTPS Server');
});

// HTTPS configuration
const options = {
  key: fs.readFileSync('path/to/private-key.pem'),
  cert: fs.readFileSync('path/to/certificate.pem'),
  // Modern, secure TLS options
  minVersion: 'TLSv1.2',
  ciphers: 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256'
};

// Create HTTPS server
https.createServer(options, app).listen(443, () => {
  console.log('HTTPS server running on port 443');
});

8. সংবেদনশীল তথ্য রক্ষা করুন

এনভায়রনমেন্ট ভেরিয়েবল এবং ডেডিকেটেড সিক্রেট ম্যানেজমেন্ট সলিউশন ব্যবহার করে সংবেদনশীল ডেটা নিরাপদে সংরক্ষণ করুন।

উদাহরণ: পরিবেশের ভেরিয়েবল ব্যবহার করা

// Load environment variables from .env file in development
if (process.env.NODE_ENV !== 'production') {
  require('dotenv').config();
}

// Access environment variables
const dbConnection = {
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME
};

// Never log sensitive information
console.log('Connected to database:', dbConnection.host);
// DON'T DO THIS: console.log('Database connection:', dbConnection);

⚠️গুরুত্বপূর্ণ:

সংবেদনশীল ডেটা সংস্করণ নিয়ন্ত্রণে জমা দেবেন না। .env ফাইল বাদ দিতে .gitignore ব্যবহার করুন।

নির্ভরশীল ত্রুটি ব্যবস্থাপনা

Node.js , .

অ্যাপ্লিকেশন নিরাপত্তা বজায় রাখার জন্য যথাযথ নির্ভরতা ব্যবস্থাপনা অপরিহার্য।

npm অডিট ব্যবহার করে

npm অডিট কমান্ড আপনার নির্ভরতা ট্রি স্ক্যান করে এবং পরিচিত ত্রুটি সহ প্যাকেজ সনাক্ত করে:

# Run a basic audit
npm audit

# Fix vulnerabilities automatically (when possible)
npm audit fix

# Fix vulnerabilities that might require major version updates
npm audit fix --force

npm অডিটের আউটপুট অন্তর্ভুক্ত:

অভাবের তীব্রতা(নিম্ন, মাঝারি, উচ্চ, গুরুত্বপূর্ণ)
প্রভাবিত প্যাকেজ এবং ত্রুটিপূর্ণ সংস্করণ সীমা
ত্রুটির বর্ণনা
ত্রুটিপূর্ণ নির্ভরতার পথ
সমস্যা সমাধানের জন্য সুপারিশকৃত পদক্ষেপ

ত্রুটি প্রতিরোধের কৌশল

লক নির্ভরতা:নির্ভরশীল সংস্করণ লক করতে package-lock.json বা yarn.lock ব্যবহার করুন
ন্যূনতম সংস্করণ সেট করুন:ন্যূনতম সীমা সহ সংস্করণ সীমা ব্যবহার করুন
স্বয়ংক্রিয় স্ক্যানিং:আপনার CI/CD পাইপলাইনে নিরাপত্তা স্ক্যানিং একত্রিত করুন
বিকল্প বিবেচনা করুন:জটিল প্যাকেজগুলির জন্য, আরও ভাল নিরাপত্তা রেকর্ড সহ বিকল্পগুলি অন্বেষণ করুন৷

তৃতীয় শ্রেণীর নিরাপত্তা সরঞ্জাম

টুল উদ্দেশ্য
Snyk নির্ভরতার জন্য স্ক্যান করে, স্বয়ংক্রিয় ফিক্স পিআর প্রদান করে এবং ক্রমাগত অ্যাপ্লিকেশনগুলি নিরীক্ষণ করে
SonarQube আপনার কোডে বাগ, কোডের গন্ধ এবং রক্ষণাবেক্ষণের সমস্যা খুঁজে পায়
OWASP Dependency-Check পরিচিত ত্রুটিগুলির সাথে প্রকল্প নির্ভরতা সনাক্ত করে
WhiteSource Bolt ওপেন সোর্স উপাদানগুলির জন্য ক্রমাগত নিরাপত্তা এবং সামঞ্জস্য

উন্নত নিরাপত্তা অনুশীলন

হার সীমা

হার সীমিত করার মাধ্যমে অপব্যবহার বা নৃশংস বল আক্রমণ থেকে আপনার APIকে রক্ষা করুন:

উদাহরণ: এক্সপ্রেস-রেট-লিমিটের সাথে হারের সীমা

const express = require('express');
const rateLimit = require('express-rate-limit');
const app = express();

// Basic rate limiter: max 100 requests per 15 minutes per IP
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100, // limit each IP to 100 requests per windowMs
  standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
  message: 'Too many requests from this IP, please try again after 15 minutes'
});

// Apply rate limiting to all requests
app.use(limiter);

// Or apply to specific routes
const loginLimiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1 hour
  max: 5, // 5 failed attempts per hour
  message: 'Too many login attempts, please try again after an hour'
});

app.post('/login', loginLimiter, (req, res) => {
  // Login logic here
});

CSRF সুরক্ষা

CSRF টোকেন সক্ষম করে ক্রস-সাইট অনুরোধ জালিয়াতি আক্রমণ প্রতিরোধ করুন:

উদাহরণ: csurf সহ CSRF নিরাপত্তা

const express = require('express');
const cookieParser = require('cookie-parser');
const csrf = require('csurf');
const app = express();

// Setup middleware
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());

// Initialize CSRF protection
const csrfProtection = csrf({ cookie: true });

// Form display route with CSRF token
app.get('/form', csrfProtection, (req, res) => {
  res.send(`
    
`); }); // Form submission route with CSRF validation app.post('/process', csrfProtection, (req, res) => { // If we get here, CSRF token was valid res.send('Data processed successfully'); }); // CSRF errors will be caught here app.use((err, req, res, next) => { if (err.code === 'EBADCSRFTOKEN') { // Handle CSRF token errors res.status(403).send('CSRF token validation failed'); } else { next(err); } });

নিরাপদ উন্নয়ন চক্র (SDLC)

নিরাপদ Node.js অ্যাপ্লিকেশন তৈরি করতে সমগ্র উন্নয়ন প্রক্রিয়ার সাথে নিরাপত্তা একীভূত করা প্রয়োজন।

এই SDLC সেরা অনুশীলনগুলি অনুসরণ করুন:

1. প্রয়োজনীয়তা এবং ডিজাইন ফেজ

  • নিরাপত্তা প্রয়োজনীয়তা এবং সম্মতি প্রয়োজনীয়তা সংজ্ঞায়িত করুন
  • সম্ভাব্য ঝুঁকি চিহ্নিত করতে হুমকি মডেলিং সঞ্চালন
  • নিরাপত্তা নীতিগুলি মাথায় রেখে ডিজাইন করুন
  • নিরাপদ ফ্রেমওয়ার্ক এবং লাইব্রেরি চয়ন করুন

2. উন্নয়ন পর্যায়

  • নিরাপদ কোডিং মান এবং লিন্ডার ব্যবহার করুন
  • ইনপুট বৈধতা এবং আউটপুট এনক্রিপশন সক্ষম করুন৷
  • ডাটাবেস অ্যাক্সেসের জন্য প্যারামিটারাইজড প্রশ্ন ব্যবহার করুন
  • ন্যূনতম অফার নীতি অনুসরণ করুন

3. পরীক্ষা পর্ব

  • স্ট্যান্ডার্ড অ্যাপ্লিকেশন সিকিউরিটি টেস্টিং (SAST) পরিচালনা করুন।
  • একটি ডায়নামিক অ্যাপ্লিকেশন সিকিউরিটি টেস্ট (DAST) সম্পাদন করুন।
  • নির্ভরতা স্ক্যান চালান
  • অনুপ্রবেশ পরীক্ষা পরিচালনা করুন

4. ডেলিভারি ও রক্ষণাবেক্ষণ

  • নিরাপদ কনফিগারেশন ম্যানেজমেন্ট ব্যবহার করুন
  • ক্রমাগত নিরাপত্তা পর্যবেক্ষণ বাস্তবায়ন
  • একটি ঘটনার প্রতিক্রিয়া পরিকল্পনা স্থাপন করুন
  • নিয়মিত নিরাপত্তা অডিটের সময়সূচী করুন

উদাহরণ: সিকিউর ডেভেলপমেন্ট চেকলিস্ট

// package.json example with security-related scripts
{
  "name": "secure-node-app",
  "version": "1.0.0",
  "scripts": {
    "start": "node app.js",
    "test": "jest",
    "lint": "eslint . --ext .js",
    "audit": "npm audit --production --audit-level=high",
    "check-vuln": "npx snyk test",
    "security-check": "npm-run-all --parallel lint audit check-vuln",
    "precommit": "npm run security-check"
  },
  "dependencies": {
    // Production dependencies
  },
  "devDependencies": {
    "eslint": "^8.0.0",
    "eslint-plugin-security": "^1.5.0",
    "jest": "^29.0.0",
    "npm-run-all": "^4.1.5",
    "snyk": "^1.1000.0"
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run security-check"
    }
  }
}

💡পরামর্শ:

আপনার সিআই/সিডি পাইপলাইনে সুরক্ষা পরীক্ষাগুলিকে একীভূত করুন যাতে তারা উত্পাদনে পৌঁছানোর আগে সুরক্ষা সমস্যাগুলি স্বয়ংক্রিয়ভাবে সনাক্ত করে।

সারাংশ

নিরাপত্তা একটি এককালীন বাস্তবায়ন নয়, কিন্তু একটি ধারাবাহিক প্রক্রিয়া।

আপনার Node.js অ্যাপ্লিকেশনগুলিকে সুরক্ষিত করতে এই সর্বোত্তম অনুশীলনগুলি অনুসরণ করুন:

সমস্ত ইনপুট যাচাই করুন এবং পরিমার্জন করুন

সাধারণ আক্রমণ থেকে রক্ষা করুন

নির্ভরতা আপডেট করুন এবং নিয়মিত অডিট করুন

নিরাপদ প্রমাণীকরণ এবং সেশন পরিচালনা সক্ষম করুন

HTTPS এবং যথাযথ নিরাপত্তা শিরোনাম ব্যবহার করুন

গুরুত্বপূর্ণ ডেটা নিরাপদে সংরক্ষণ করুন

হার সীমিত করা এবং পর্যবেক্ষণ করা

প্রতিষ্ঠিত নিরাপত্তা নির্দেশিকা অনুসরণ করুন

💡মনে রাখবেন:

নিরাপত্তা আপনার অ্যাপের দুর্বলতম লিঙ্কের মতোই শক্তিশালী। সমস্ত উত্পাদন অ্যাপ্লিকেশনের জন্য নিয়মিত নিরাপত্তা পর্যালোচনা এবং অনুপ্রবেশ পরীক্ষার সুপারিশ করা হয়।

অনুশীলন করুন

______ কমান্ড ত্রুটির জন্য আপনার নির্ভরতা পরীক্ষা করে।

npm audit
✓ ঠিক আছে! "npm অডিট" কমান্ড আপনার নির্ভরতা ট্রি স্ক্যান করে এবং পরিচিত নিরাপত্তা ত্রুটি সহ প্যাকেজগুলি সনাক্ত করে। এটি ঘাটতিগুলি সংশোধন করার জন্য সুপারিশও প্রদান করে।
npm check
✗ ভুল! "npm চেক" একটি বৈধ npm কমান্ড নয়। "npm অডিট" নির্ভরতা পরীক্ষা করতে ব্যবহৃত হয়।
npm security
✗ ভুল! "npm নিরাপত্তা" একটি বৈধ npm কমান্ড নয়। "npm অডিট" নির্ভরতা পরীক্ষা করতে ব্যবহৃত হয়।
npm scan
✗ ভুল! "npm স্ক্যান" একটি বৈধ npm কমান্ড নয়। "npm অডিট" নির্ভরতা পরীক্ষা করতে ব্যবহৃত হয়।